【2023年7月版 】GitHub Actions 上で OIDC 連携 Assume Role してみる
こんにちは、森田です。
本記事では、GitHub Actions で OIDC 連携で Assume Role する方法を紹介していきます
はじめに
直近で thumbprint が変更となっているため、以前と同じ値で設定するとエラーが生じるようです。
An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint
thumbprint 変更は、証明書変更となるタイミングで生じますので、手動更新または、自動更新の仕組みを導入する必要があります。
本記事では、2023年7月時点での以下の thumbprint を設定していきます。
1c58a3a8518e8759bf075b76b750d4f2df264fcd f879abce0008e4eb126e0097e46620f5aaae26ad
ロールの作成
以下のコードを利用して CloudFormation でロールの作成を行います。
AWSTemplateFormatVersion: "2010-09-09" Description: "IAM Role for OIDC GitHub" Parameters: RepoName: Type: String Resources: Role: Type: AWS::IAM::Role Properties: RoleName: OIDCGithubRole AssumeRolePolicyDocument: Statement: - Effect: Allow Action: sts:AssumeRoleWithWebIdentity Principal: Federated: !Ref GithubOidc Condition: StringLike: token.actions.githubusercontent.com:sub: !Sub repo:${RepoName}:* GithubOidc: Type: AWS::IAM::OIDCProvider Properties: Url: https://token.actions.githubusercontent.com ClientIdList: [sigstore] ThumbprintList: [1c58a3a8518e8759bf075b76b750d4f2df264fcd, f879abce0008e4eb126e0097e46620f5aaae26ad] Outputs: Role: Value: !GetAtt Role.Arn
CloudFormation では、以下のようにリポジトリの入力が求められます。
CloudFormationスタック作成後は、出力に表示されているロールのARNをメモしておきます。
GitHub 側の設定
環境変数の設定
先ほど作成したロールのARNを環境変数に設定します。
ワークフローの作成
今回は、動作確認のため、以下のようなワークフローを作成します。
on: push: branches: - main jobs: build: runs-on: ubuntu-latest env: AWS_ROLE_ARN: ${{ secrets.AWS_ROLE_ARN }} permissions: id-token: write contents: read steps: - name: Checkout uses: actions/checkout@master - name: Configure AWS run: | export AWS_ROLE_ARN=$AWS_ROLE_ARN export AWS_WEB_IDENTITY_TOKEN_FILE=/tmp/awscreds export AWS_DEFAULT_REGION=ap-northeast-1 echo AWS_WEB_IDENTITY_TOKEN_FILE=$AWS_WEB_IDENTITY_TOKEN_FILE >> $GITHUB_ENV echo AWS_ROLE_ARN=$AWS_ROLE_ARN >> $GITHUB_ENV echo AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION >> $GITHUB_ENV curl -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" "$ACTIONS_ID_TOKEN_REQUEST_URL&audience=sigstore" | jq -r '.value' > $AWS_WEB_IDENTITY_TOKEN_FILE - run: aws sts get-caller-identity
上記のコードでは、GetCallerIdentityを実行して、アカウントIDなどを取得しています。
動作確認
作成したワークフローは、mainブランチへのpushをトリガーとしています。
実際にpushしてみると以下のようにログにて各種情報を取得できていれば、問題なく OIDC 連携で Assume Role ができています。
最後に
今回は、新しい thumbprint を用いて GitHub Actions 上で OIDC 連携 Assume Role をやってみましたがお手軽に実行できました。
手動で thumbprint を設定しましたが、自動で取得してくれるものあるので、そのようなものを導入するとより楽になりますね!